package beanstao.util.chart;

import java.awt.Font;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DatasetUtilities;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;

/**
 * 
 * 图形展示帮助类
 * 
 * @author beanstao@google.com Jert
 * 
 */
public class ChartHelper
{

	/**
	 * 得到Category展示数据存放的集合。得到后用dataset.setValue()设置数据。
	 * 
	 * @return dataset
	 */
	public static DefaultCategoryDataset getDatasetOfCategory()
	{
		return new DefaultCategoryDataset();
	}

	/**
	 * 得到pie展示数据存放的集合。得到后用dataset.setValue()设置数据。
	 * 
	 * @return dataset
	 */
	public static DefaultPieDataset getDatasetOfPie()
	{
		return new DefaultPieDataset();
	}

	/**
	 * 得到折线图展示数据存放的集合。
	 * 
	 * @param rowKeys
	 *            需要展示的折线的说明 。
	 * @param colKeys
	 *            展示折线的分点。
	 * @param data
	 *            每条折线的不同分点的具体数值。
	 * @return
	 */
	public static CategoryDataset getCategoryDatasetOfLine(String[] rowKeys, String[] colKeys, double[][] data)
	{
		return DatasetUtilities.createCategoryDataset(rowKeys, colKeys, data);
	}

	/**
	 * 柱形图
	 * 
	 * @param title
	 *            图表标题
	 * @param XLable
	 *            目录轴的显示标签
	 * @param YLable
	 *            数值轴的显示标签
	 * @param dataset
	 *            数据集
	 * @param p
	 *            图表方向：水平、垂直
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createBarChart(String title, String XLable, String YLable, CategoryDataset dataset, PlotOrientation p, boolean legend, boolean tooltips, boolean urls)
	{
		return ChartFactory.createBarChart(title, XLable, YLable, dataset, p, legend, tooltips, urls);
	}

	/**
	 * 包含字体设置的柱形图
	 * 
	 * @param title
	 *            图表标题
	 * @param XLable
	 *            目录轴的显示标签
	 * @param YLable
	 *            数值轴的显示标签
	 * @param dataset
	 *            数据集
	 * @param p
	 *            图表方向：水平、垂直
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createBarChart$DefaultFont(String title, String XLable, String YLable, CategoryDataset dataset, PlotOrientation p, boolean legend, boolean tooltips, boolean urls)
	{
		JFreeChart chart = ChartFactory.createBarChart(title, XLable, YLable, dataset, p, legend, tooltips, urls);
		setFontBarChartDefault(chart);
		return chart;
	}

	/**
	 * 3D柱形图
	 * 
	 * @param title
	 *            图表标题
	 * @param XLable
	 *            目录轴的显示标签
	 * @param YLable
	 *            数值轴的显示标签
	 * @param dataset
	 *            数据集
	 * @param p
	 *            图表方向：水平、垂直
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createBarChart3D(String title, String XLable, String YLable, CategoryDataset dataset, PlotOrientation p, boolean legend, boolean tooltips, boolean urls)
	{
		return ChartFactory.createBarChart3D(title, XLable, YLable, dataset, p, legend, tooltips, urls);
	}

	/**
	 * 包含字体设置的3D柱形图
	 * 
	 * @param title
	 *            图表标题
	 * @param XLable
	 *            目录轴的显示标签
	 * @param YLable
	 *            数值轴的显示标签
	 * @param dataset
	 *            数据集
	 * @param p
	 *            图表方向：水平、垂直
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createBarChart3D$DefaultFont(String title, String XLable, String YLable, CategoryDataset dataset, PlotOrientation p, boolean legend, boolean tooltips, boolean urls)
	{
		JFreeChart chart = ChartFactory.createBarChart3D(title, XLable, YLable, dataset, p, legend, tooltips, urls);
		setFontBarChartDefault(chart);
		return chart;
	}

	/**
	 * 饼形图
	 * 
	 * @param title
	 * @param dataset
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createPieChart(String title, PieDataset dataset, boolean legend, boolean tooltips, boolean urls)
	{
		return ChartFactory.createPieChart(title, dataset, legend, tooltips, urls);
	}

	/**
	 * 包含字体设置的饼形图
	 * 
	 * @param title
	 * @param dataset
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createPieChart$DefaultFont(String title, PieDataset dataset, boolean legend, boolean tooltips, boolean urls)
	{
		JFreeChart chart = ChartFactory.createPieChart(title, dataset, legend, tooltips, urls);
		setFontPiePlotDefault(chart);
		return chart;
	}

	/**
	 * 3D饼形图
	 * 
	 * @param title
	 * @param dataset
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createPieChart3D(String title, PieDataset dataset, boolean legend, boolean tooltips, boolean urls)
	{
		return ChartFactory.createPieChart3D(title, dataset, legend, tooltips, urls);
	}

	/**
	 * 包含字体设置的3D饼形图
	 * 
	 * @param title
	 * @param dataset
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createPieChart3D$DefaultFont(String title, PieDataset dataset, boolean legend, boolean tooltips, boolean urls)
	{
		JFreeChart chart = ChartFactory.createPieChart3D(title, dataset, legend, tooltips, urls);
		setFontPiePlotDefault(chart);
		return chart;
	}

	/**
	 * 折线图
	 * 
	 * @param title
	 *            标题
	 * @param categoryAxisLabel
	 *            X轴标签
	 * @param valueAxisLabel
	 *            Y轴标签
	 * @param dataset
	 * @param orientation
	 *            图表方向：水平、垂直
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createLineChart(String title, String categoryAxisLabel, String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)
	{
		return ChartFactory.createLineChart(title, categoryAxisLabel, valueAxisLabel, dataset, orientation, legend, tooltips, urls);
	}

	/**
	 * 包含字体设置的折线图
	 * 
	 * @param title
	 *            标题
	 * @param categoryAxisLabel
	 *            X轴标签
	 * @param valueAxisLabel
	 *            Y轴标签
	 * @param dataset
	 * @param orientation
	 *            图表方向：水平、垂直
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createLineChart$DefaultFont(String title, String categoryAxisLabel, String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)
	{
		JFreeChart chart = ChartFactory.createLineChart(title, categoryAxisLabel, valueAxisLabel, dataset, orientation, legend, tooltips, urls);
		setFontLineChartDefault(chart);
		return chart;
	}

	/**
	 * 折线图
	 * 
	 * @param title
	 *            标题
	 * @param categoryAxisLabel
	 *            X轴标签
	 * @param valueAxisLabel
	 *            Y轴标签
	 * @param dataset
	 * @param orientation
	 *            图表方向：水平、垂直
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createLineChart3D(String title, String categoryAxisLabel, String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)
	{
		return ChartFactory.createLineChart3D(title, categoryAxisLabel, valueAxisLabel, dataset, orientation, legend, tooltips, urls);
	}

	/**
	 * 包含字体设置的折线图
	 * 
	 * @param title
	 *            标题
	 * @param categoryAxisLabel
	 *            X轴标签
	 * @param valueAxisLabel
	 *            Y轴标签
	 * @param dataset
	 * @param orientation
	 *            图表方向：水平、垂直
	 * @param legend
	 *            是否显示图例(对于简单的柱状图必须是false)
	 * @param tooltips
	 *            是否生成工具
	 * @param urls
	 *            是否生成URL链接
	 * @return
	 */
	public static JFreeChart createLineChart3D$DefaultFont(String title, String categoryAxisLabel, String valueAxisLabel, CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls)
	{
		JFreeChart chart = ChartFactory.createLineChart3D(title, categoryAxisLabel, valueAxisLabel, dataset, orientation, legend, tooltips, urls);
		setFontLineChartDefault(chart);
		return chart;
	}

	/**
	 * BarChart展示图层字体设置
	 * 
	 * @param chart
	 */
	public static void setFontBarChartDefault(JFreeChart chart)
	{
		chart.getTitle().setFont(new Font("宋体", Font.BOLD, 16));

		CategoryPlot plot = chart.getCategoryPlot();
		CategoryAxis domainAxis = plot.getDomainAxis();
		domainAxis.setTickLabelFont(new Font("宋体", Font.BOLD, 12));
		domainAxis.setLabelFont(new Font("宋体", Font.BOLD, 12));

		ValueAxis valueAxis = plot.getRangeAxis();
		valueAxis.setLabelFont(new Font("宋体", Font.BOLD, 12));

		chart.getLegend().setItemFont(new Font("宋体", Font.PLAIN, 12));
	}

	/**
	 * PiePlot展示图层字体设置
	 * 
	 * @param chart
	 */
	public static PiePlot setFontPiePlotDefault(JFreeChart chart)
	{
		chart.getTitle().setFont(new Font("宋体", Font.BOLD, 12));

		PiePlot pie = (PiePlot) chart.getPlot();

		pie.setLabelFont(new Font("宋体", Font.BOLD, 12));
		// pie.setNoDataMessage("No data available");
		// pie.setCircular(true);
		// pie.setLabelGap(0.02D);// 间距

		chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 12));

		return pie;
	}

	/**
	 * LineChart展示图层字体设置
	 * 
	 * @param chart
	 */
	public static void setFontLineChartDefault(JFreeChart chart)
	{
		setFontBarChartDefault(chart);
	}

	/**
	 * 窗口展示图层。
	 * 
	 * @param title
	 *            展示图标题
	 * @param chart
	 * @param scrollPane
	 *            是否滚动条
	 */
	public static void showChartFrame(String title, JFreeChart chart, boolean scrollPane)
	{
		ChartFrame frame = new ChartFrame(title, chart, true);
		frame.pack();
		frame.setVisible(true);
	}

	/**
	 * 文件格式保存图示
	 * 
	 * @param chart
	 * @param outputPath
	 *            生成文件路径。如："F:\\jfreechart\\line.png"。
	 * @param weight
	 * @param height
	 */
	public static void saveAsFile(JFreeChart chart, String outputPath, int weight, int height)
	{
		FileOutputStream out = null;
		try
		{
			File outFile = new File(outputPath);
			if (!outFile.getParentFile().exists())
				outFile.getParentFile().mkdirs();

			out = new FileOutputStream(outputPath);

			ChartUtilities.writeChartAsPNG(out, chart, weight, height);

			out.flush();
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			if (out != null)
			{
				try
				{
					out.close();
				}
				catch (IOException e)
				{
					// do nothing
				}
			}
		}
	}
}
